lst = range(5)
def foo():
lst += [3,4]
foo()
#提示:UnboundLocalError: local variable 'lst' referenced before assignment
如果方法体是
def foo():
lst.append([3,4])
则没问题,知道大概的原因是list1 + list2后创建了一个新的对象,谁能说说具体原因
11 个解决方案
#1
你该这样写
为什么呢?这涉及到局部变量和全局变量的关系!
你
这样定义,lst是一个全局变量
在函数foo()里面lst是没有定义的,所以报错:UnboundLocalError: local variable 'lst' referenced before assignment
即变量使用前未申明!
def foo(lst):
lst += [3,4]
为什么呢?这涉及到局部变量和全局变量的关系!
你
lst = range(5)
def foo():
lst += [3,4]
foo()
这样定义,lst是一个全局变量
在函数foo()里面lst是没有定义的,所以报错:UnboundLocalError: local variable 'lst' referenced before assignment
即变量使用前未申明!
#2
如果你还不懂请自行百度python变量作用域 找相关资料,或者留言。
#3
不建议单独写函数做list扩展。。。尽量用库函数。请参考: Python:list,tuple,dict--The_Third_Wave整理资料
http://blog.csdn.net/zhanh1218/article/details/21864531
#4
说的很有道理,不过用append和extend方法就不会出问题,怎么解释?
#5
对象赋值不都是引用,怎么会有局部变量只说?
#6
请认真看1楼啊。。。
#7
如果你还不懂请自行百度python变量作用域 找相关资料,或者留言。
对象赋值不都是引用,怎么会有局部变量只说?
你对函数里面的变量和函数外面的变量还不了解。。。建议多看看,很多语言都有局部变量和全局变量的。
#8
你该这样写def foo(lst):
lst += [3,4]
为什么呢?这涉及到局部变量和全局变量的关系!
你lst = range(5)
def foo():
lst += [3,4]
foo()
这样定义,lst是一个全局变量
在函数foo()里面lst是没有定义的,所以报错:UnboundLocalError: local variable 'lst' referenced before assignment
即变量使用前未申明!
说的很有道理,不过用append和extend方法就不会出问题,怎么解释?
这个我仔细想了下,lst += [3,4] 这样定义,python只lst是不是一个局部变量,但实际这个局部变量没有定义直接抛出异常。
lst.append([3,4]) 这样定义python首先寻找局部list型变量lst,没找到,如是找全局变量lst找到了,于是,不会报错。
这个为什么,你可以说python本身设计的缺陷,也可能他觉得这样更合理。
我比较倾向于函数体内严格检查,也就是说,我倾向于他抛出异常,最好第二个也抛出异常。这样不会犯错,我们把需要处理的东西作为函数入口,这样比较安全,可控。这叫函数式编程,我的blog里有: http://blog.csdn.net/zhanh1218/article/details/21631119。当然,函数体内引用外部变量有用处!
最终建议:用面向对象的方法写程序。
#9
你该这样写def foo(lst):
lst += [3,4]
为什么呢?这涉及到局部变量和全局变量的关系!
你lst = range(5)
def foo():
lst += [3,4]
foo()
这样定义,lst是一个全局变量
在函数foo()里面lst是没有定义的,所以报错:UnboundLocalError: local variable 'lst' referenced before assignment
即变量使用前未申明!
说的很有道理,不过用append和extend方法就不会出问题,怎么解释?
这个我仔细想了下,lst += [3,4] 这样定义,python只lst是不是一个局部变量,但实际这个局部变量没有定义直接抛出异常。
lst.append([3,4]) 这样定义python首先寻找局部list型变量lst,没找到,如是找全局变量lst找到了,于是,不会报错。
这个为什么,你可以说python本身设计的缺陷,也可能他觉得这样更合理。
我比较倾向于函数体内严格检查,也就是说,我倾向于他抛出异常,最好第二个也抛出异常。这样不会犯错,我们把需要处理的东西作为函数入口,这样比较安全,可控。这叫函数式编程,我的blog里有: http://blog.csdn.net/zhanh1218/article/details/21631119。当然,函数体内引用外部变量有用处!
最终建议:用面向对象的方法写程序。
太感谢了。不过我也找到了一个说服自己的理由: 当你给作用域中的一个变量赋值时,Python 会自动的把它当做是当前作用域的局部变量,从而会隐藏外部作用域中的同名变量。append extend不是赋值,所以。不知道,你怎么看?
#10
python赋值即创建变量
#11
解释可行。不过我没出过这样的错误…我肯定把要处理的东西当参数。除非涉及到迭代,非用不可,那个就和你写的第二个一样。
#1
你该这样写
为什么呢?这涉及到局部变量和全局变量的关系!
你
这样定义,lst是一个全局变量
在函数foo()里面lst是没有定义的,所以报错:UnboundLocalError: local variable 'lst' referenced before assignment
即变量使用前未申明!
def foo(lst):
lst += [3,4]
为什么呢?这涉及到局部变量和全局变量的关系!
你
lst = range(5)
def foo():
lst += [3,4]
foo()
这样定义,lst是一个全局变量
在函数foo()里面lst是没有定义的,所以报错:UnboundLocalError: local variable 'lst' referenced before assignment
即变量使用前未申明!
#2
如果你还不懂请自行百度python变量作用域 找相关资料,或者留言。
#3
不建议单独写函数做list扩展。。。尽量用库函数。请参考: Python:list,tuple,dict--The_Third_Wave整理资料
http://blog.csdn.net/zhanh1218/article/details/21864531
#4
你该这样写def foo(lst):
lst += [3,4]
为什么呢?这涉及到局部变量和全局变量的关系!
你lst = range(5)
def foo():
lst += [3,4]
foo()
这样定义,lst是一个全局变量
在函数foo()里面lst是没有定义的,所以报错:UnboundLocalError: local variable 'lst' referenced before assignment
即变量使用前未申明!
说的很有道理,不过用append和extend方法就不会出问题,怎么解释?
#5
如果你还不懂请自行百度python变量作用域 找相关资料,或者留言。
对象赋值不都是引用,怎么会有局部变量只说?
#6
你该这样写def foo(lst):
lst += [3,4]
为什么呢?这涉及到局部变量和全局变量的关系!
你lst = range(5)
def foo():
lst += [3,4]
foo()
这样定义,lst是一个全局变量
在函数foo()里面lst是没有定义的,所以报错:UnboundLocalError: local variable 'lst' referenced before assignment
即变量使用前未申明!
说的很有道理,不过用append和extend方法就不会出问题,怎么解释?
请认真看1楼啊。。。
#7
如果你还不懂请自行百度python变量作用域 找相关资料,或者留言。
对象赋值不都是引用,怎么会有局部变量只说?
你对函数里面的变量和函数外面的变量还不了解。。。建议多看看,很多语言都有局部变量和全局变量的。
#8
你该这样写def foo(lst):
lst += [3,4]
为什么呢?这涉及到局部变量和全局变量的关系!
你lst = range(5)
def foo():
lst += [3,4]
foo()
这样定义,lst是一个全局变量
在函数foo()里面lst是没有定义的,所以报错:UnboundLocalError: local variable 'lst' referenced before assignment
即变量使用前未申明!
说的很有道理,不过用append和extend方法就不会出问题,怎么解释?
这个我仔细想了下,lst += [3,4] 这样定义,python只lst是不是一个局部变量,但实际这个局部变量没有定义直接抛出异常。
lst.append([3,4]) 这样定义python首先寻找局部list型变量lst,没找到,如是找全局变量lst找到了,于是,不会报错。
这个为什么,你可以说python本身设计的缺陷,也可能他觉得这样更合理。
我比较倾向于函数体内严格检查,也就是说,我倾向于他抛出异常,最好第二个也抛出异常。这样不会犯错,我们把需要处理的东西作为函数入口,这样比较安全,可控。这叫函数式编程,我的blog里有: http://blog.csdn.net/zhanh1218/article/details/21631119。当然,函数体内引用外部变量有用处!
最终建议:用面向对象的方法写程序。
#9
你该这样写def foo(lst):
lst += [3,4]
为什么呢?这涉及到局部变量和全局变量的关系!
你lst = range(5)
def foo():
lst += [3,4]
foo()
这样定义,lst是一个全局变量
在函数foo()里面lst是没有定义的,所以报错:UnboundLocalError: local variable 'lst' referenced before assignment
即变量使用前未申明!
说的很有道理,不过用append和extend方法就不会出问题,怎么解释?
这个我仔细想了下,lst += [3,4] 这样定义,python只lst是不是一个局部变量,但实际这个局部变量没有定义直接抛出异常。
lst.append([3,4]) 这样定义python首先寻找局部list型变量lst,没找到,如是找全局变量lst找到了,于是,不会报错。
这个为什么,你可以说python本身设计的缺陷,也可能他觉得这样更合理。
我比较倾向于函数体内严格检查,也就是说,我倾向于他抛出异常,最好第二个也抛出异常。这样不会犯错,我们把需要处理的东西作为函数入口,这样比较安全,可控。这叫函数式编程,我的blog里有: http://blog.csdn.net/zhanh1218/article/details/21631119。当然,函数体内引用外部变量有用处!
最终建议:用面向对象的方法写程序。
太感谢了。不过我也找到了一个说服自己的理由: 当你给作用域中的一个变量赋值时,Python 会自动的把它当做是当前作用域的局部变量,从而会隐藏外部作用域中的同名变量。append extend不是赋值,所以。不知道,你怎么看?
#10
python赋值即创建变量
#11
解释可行。不过我没出过这样的错误…我肯定把要处理的东西当参数。除非涉及到迭代,非用不可,那个就和你写的第二个一样。