text1 = "Hello" list1 = [] def changeText(): text1 = "world!" def changeList(): list1.append("A") list1.append("B") if __name__ == "__main__": changeText() changeList() print text1 print list1
输出结果是:
Hello ['A', 'B']
也就是说text1的值并没有被改变,请问这是为什么呢?text1和list1都是定义在函数外部的变量,为什么字符串的值无法在函数中改变而列表的值可以改变呢?
另外,还有这样一段代码:
flag = True def xxx(): if flag: print "True" flag = False else: print "False" flag = True if __name__ == "__main__": xxx()
本意也是想在函数中改变flag的值,但是输出却直接说
Traceback (most recent call last): File "test3.py", line 12, in <module> xxx() File "test3.py", line 4, in xxx if flag: UnboundLocalError: local variable 'flag' referenced before assignment
对python的变量作用域问题不是很理解,请教一下,谢谢!
你好,
第一个问题:text1的值并没有被改变,请问这是为什么呢?
首先你需要了解python中的可变对象和不可变对象:
可变对象有:list,dict
不可变对象有:数字,string,元组
我简单的说一下,不可变对象:简单的说就是不可变的,这个不可变的是这么理解的
a = 'a'
old_id_a = id(a)
a = 'b'
new_id_a = id(b)
old_id_a == new_id_a #返回的是False
也就是说,但你对a再次赋值的时候,第二个a就不是第一个a了。
所以,全局变量的test1,和方法中的test1不是同一个地址,而你print的是全局变量的test1请参考:http://thomaschen2011.iteye.com/blog/1441254
第二个问题:text1和list1都是定义在函数外部的变量,为什么字符串的值无法在函数中改变而列表的值可以改变呢?
结合上面的回答,尝试解决一下,如果明白了尝试解决下面这个问题;如果还有疑问,看看下面这个问题的最佳回答,或许你就豁然开朗了,地址:http://stackoverflow.com/questions/9887180/the-value-of-an-empty-list-in-function-parameter-example-here
-------
第三个问题:
python的变量作用域问题?
一步步的来,python中的全局变量你在任何地方都可以访问:
a = False
def test_print():
print a # 输出False
好了这个说完,下面你需要知道,python寻找变量的顺序,我这里只简单的说一下:先找局部作用域,再找全局作用域。
回到你的问题,error信息的大致意思是:你没有定义就使用这个变量。为什么会这样?flag你已经定义了,还是全局变量。按照我上面说的在方法体中是可以访问的,但是你的例子问什么不行?是因为:你又在方法体中对flag赋值了!所以你的if flag:的时候这个flag会在方法体中找,找到你下面有一个flag变量,所以他就不去找全局变量中的flag了。所以,最后判定错误为:本地变量flag没有赋值就引用。
如需要知道python作用域请参考http://www.jianshu.com/p/3bb277c2935c
嗯,懂了,特别是第三个问题解释得很清楚。非常感谢!
def changeText():
global text1
text1 = "world!"