相关疑难解决方法(0)

Python变量范围错误

以下代码在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).的值ab被正确地打印.这让我感到困惑,原因有两个:

  1. 为什么在行(A)处抛出运行时错误,因为后面的行(B)语句?

  2. 为什么变量ab打印符合预期,同时c引发错误?

我能想到的唯一解释是,赋值创建了一个局部变量,即使在创建局部变量之前,它也优先于"全局"变量.当然,变量在存在之前"窃取"范围是没有意义的.cc+=1c

有人可以解释一下这种行为吗?

python variables scope

195
推荐指数
7
解决办法
6万
查看次数

不明白为什么会发生UnboundLocalError

我在这做错了什么?

counter = 0

def increment():
  counter += 1

increment()
Run Code Online (Sandbox Code Playgroud)

上面的代码抛出了一个UnboundLocalError.

python scope global-variables

153
推荐指数
5
解决办法
18万
查看次数

Python列表+ = iterable的行为是否记录在任何地方?

看起来在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)

这种行为记录在哪里吗?

为了与之形成对比list + x,后者只有在x同样的情况下才有效list.这在文档中有详细说明.

python containers operators

28
推荐指数
2
解决办法
786
查看次数

关于python中列表的操作

我处在一个非常有趣的情况,我很惊讶.实际上我认为两者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)

它不起作用.

我真的很困惑.他们不一样吗?

python list operation

6
推荐指数
1
解决办法
118
查看次数

使用+ =但不附加列表时的UnboundLocalError

我不太明白以下两个相似代码之间的区别:

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.为什么+运算符会生成错误?谢谢

python list append

4
推荐指数
1
解决办法
170
查看次数

函数内外的Python全局列表修改

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 关键字?感谢您帮助理解这一点。

python

3
推荐指数
1
解决办法
1822
查看次数