以下代码在Python 2.5和3.0中按预期工作:
a, b, c = (1, 2, 3)
print(a, b, c)
def test():
print(a)
print(b)
print(c) # (A)
#c+=1 # (B)
test()
Run Code Online (Sandbox Code Playgroud)
但是,当我取消注释行(B)时,我得到了UnboundLocalError: 'c' not assigned一行(A).的值a和b被正确地打印.这让我感到困惑,原因有两个:
为什么在行(A)处抛出运行时错误,因为后面的行(B)语句?
为什么变量a和b打印符合预期,同时c引发错误?
我能想到的唯一解释是,赋值创建了一个局部变量,即使在创建局部变量之前,它也优先于"全局"变量.当然,变量在存在之前"窃取"范围是没有意义的.cc+=1c
有人可以解释一下这种行为吗?
我在这做错了什么?
counter = 0
def increment():
counter += 1
increment()
Run Code Online (Sandbox Code Playgroud)
上面的代码抛出了一个UnboundLocalError.
看起来在Python中,list += x适用于任何可迭代的x:
In [6]: l = []
In [7]: l += [1]
In [8]: l += (2, 3)
In [9]: l += xrange(5)
In [10]: l
Out[10]: [1, 2, 3, 0, 1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)
这种行为记录在哪里吗?
我处在一个非常有趣的情况,我很惊讶.实际上我认为两者i += 1 and i = i + 1都是一样的.但这里并不相同;
a = [1,2]
a += "ali"
Run Code Online (Sandbox Code Playgroud)
和 output is [1,2,"a","l","i"]
但如果我这样写
a = [1,2]
a = a + "ali"
Run Code Online (Sandbox Code Playgroud)
它不起作用.
我真的很困惑.他们不一样吗?
我不太明白以下两个相似代码之间的区别:
def y(x):
temp=[]
def z(j):
temp.append(j)
z(1)
return temp
Run Code Online (Sandbox Code Playgroud)
调用y(2)返回[1]
def y(x):
temp=[]
def z(j):
temp+=[j]
z(1)
return temp
Run Code Online (Sandbox Code Playgroud)
调用y(2)返回UnboundLocalError: local variable 'temp' referenced before assignment.为什么+运算符会生成错误?谢谢
2我对 Python 比较陌生(使用 3.3.3)并且有一个与列表相关的问题。在函数内修改全局列表变量时(请不要讲全局变量的弊端),通常不需要在函数内使用 global 关键字声明列表 - 只要您坚持使用列表方法。特别是,您不能在不首先使用 global 关键字的情况下使用增强加法。让我感到惊讶的是,在函数外使用增广加法显然不会修改列表变量(仅列表内容),因此我希望可以在不使用 global 关键字的情况下在函数内使用它。这里有两个我无法调和的例子:
list_1 = []
def my_func():
list_1.append(0)
#list_1 += [0]
my_func()
print('list_1 =', list_1)
Run Code Online (Sandbox Code Playgroud)
list_1 = [0]正如预期的那样,这会打印,而注释掉的增强加法操作会生成一个关于在赋值之前使用局部变量的抱怨。
这是一个我无法与前一个协调的例子:
list_1 = [0]
list_2 = list_1
list_1 += [1]
print('list_2 =', list_2)
Run Code Online (Sandbox Code Playgroud)
这会打印list_2 = [0, 1],这向我表明list_1 += [1]没有修改 list_1 变量。我知道这list_1 = list[1] + [1]符合修改 list_1 的条件,但增强添加似乎没有。为什么在函数内部的增广加法需要使用 global 关键字?感谢您帮助理解这一点。