python list 合并疑惑

时间:2022-06-02 00:15:03

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


你该这样写
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


引用 1 楼 u013171165 的回复:
你该这样写
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


引用 2 楼 u013171165 的回复:
如果你还不懂请自行百度python变量作用域 找相关资料,或者留言。


对象赋值不都是引用,怎么会有局部变量只说?

#6


引用 4 楼 littlebo01 的回复:
Quote: 引用 1 楼 u013171165 的回复:

你该这样写
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


引用 5 楼 littlebo01 的回复:
Quote: 引用 2 楼 u013171165 的回复:

如果你还不懂请自行百度python变量作用域 找相关资料,或者留言。


对象赋值不都是引用,怎么会有局部变量只说?

你对函数里面的变量和函数外面的变量还不了解。。。建议多看看,很多语言都有局部变量和全局变量的。

#8


引用 4 楼 littlebo01 的回复:
Quote: 引用 1 楼 u013171165 的回复:

你该这样写
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


引用 8 楼 u013171165 的回复:
Quote: 引用 4 楼 littlebo01 的回复:

Quote: 引用 1 楼 u013171165 的回复:

你该这样写
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


你该这样写
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


引用 1 楼 u013171165 的回复:
你该这样写
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


引用 2 楼 u013171165 的回复:
如果你还不懂请自行百度python变量作用域 找相关资料,或者留言。


对象赋值不都是引用,怎么会有局部变量只说?

#6


引用 4 楼 littlebo01 的回复:
Quote: 引用 1 楼 u013171165 的回复:

你该这样写
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


引用 5 楼 littlebo01 的回复:
Quote: 引用 2 楼 u013171165 的回复:

如果你还不懂请自行百度python变量作用域 找相关资料,或者留言。


对象赋值不都是引用,怎么会有局部变量只说?

你对函数里面的变量和函数外面的变量还不了解。。。建议多看看,很多语言都有局部变量和全局变量的。

#8


引用 4 楼 littlebo01 的回复:
Quote: 引用 1 楼 u013171165 的回复:

你该这样写
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


引用 8 楼 u013171165 的回复:
Quote: 引用 4 楼 littlebo01 的回复:

Quote: 引用 1 楼 u013171165 的回复:

你该这样写
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


解释可行。不过我没出过这样的错误…我肯定把要处理的东西当参数。除非涉及到迭代,非用不可,那个就和你写的第二个一样。