首页 新闻 会员 周边

python变量作用域问题

0
悬赏园豆:10 [已解决问题] 解决于 2016-02-21 23:50
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的变量作用域问题不是很理解,请教一下,谢谢!

飞鸟_Asuka的主页 飞鸟_Asuka | 初学一级 | 园豆:193
提问于:2016-02-21 20:15
< >
分享
最佳答案
1

你好,

第一个问题: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

 

收获园豆:10
削微寒 | 菜鸟二级 |园豆:212 | 2016-02-21 23:16

嗯,懂了,特别是第三个问题解释得很清楚。非常感谢!

飞鸟_Asuka | 园豆:193 (初学一级) | 2016-02-21 23:50
其他回答(1)
0

def changeText():

  global text1 

  text1 = "world!"

亚可西 | 园豆:202 (菜鸟二级) | 2016-02-21 20:34
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册