首页 > 试题广场 >

下列代码执行结果是什么? x = 1 def chan

[单选题]
Python3中,下列代码执行结果是什么?
x = 1
def change(a):
    x += 1
    print(x)
change(x)




  • 1
  • 2
  • 3
  • 报错

首先排版的缩进问题就会报错,先给出顺眼的排版:

x = 1
def change(a):
    x += 1
    print x
change(x)

其次抛开排版不讲,以上代码运行后第 3 行会报以下错误:

UnboundLocalError: local variable 'x' referenced before assignment

即 change(a) 函数内的局部变量 x 在使用前未定义。

解法一:用 global 声明变量 x,使其成为全局变量

x = 1
def change(a):
    global x
    x += 1
    print x
change(x)

解法二:将函数内的 x 参数改为 a

x = 1
def change(a):
    a += 1
    print a
change(x)

以上解法均能得到结果 2。

编辑于 2018-04-09 09:13:11 回复(5)

写了几年Python了,来回答一下这道题。

这道题考察的是Python的变量作用于(即LEGB规则)

x = 1
def change(a):
    x += 1
    print x
change(x)

对于原问题,高票解释得已经足够了,我想补充一点,如果是对于change()函数内访问x而不去修改它,这样的操作是合法的,即

x = 1
def change(a):
    # 这里我们并没有修改x
    print x+a 
change(x)

引申一下: 闭包的情况下,嵌套函数修改上层变量同样需要类似global的关键字nonlocal

编辑于 2018-07-27 10:40:02 回复(1)
以下仅为我的个人理解:x=1里的x是全局变量;change函数里的x是一个局部变量,两个变量只是同名但是两个独立不同的变量。局部变量x在没有赋值的时候直接执行语句x+=1,即x=x+1,系统并不知道这个x原来是多少,没办法再加1返回,所以会报错。
发表于 2019-03-08 10:18:16 回复(0)
函数内部变量x使用前没有声明,用global 声明x
发表于 2018-04-20 13:58:21 回复(0)
x = 12
def change(a):
    #x = x +  1    # x同时出现在=两边,报错
    x = a + 15     # x只出现在左边,作为局部变量,不报错。
    print x          #打印27
change(x)

print x     #打印12


发表于 2018-03-31 08:42:26 回复(0)

函数内部的x出现在等号两边会报错,这时候可以采用global来解决此问题

发表于 2019-03-08 09:32:51 回复(0)
原题:
# -*- coding: UTF-8 -*-
x = 1
def change(a):
    x += 1
    print x
change(x)


Traceback (most recent call last):
  File "/tmp/993242231/main.py", line 6, in <module>
    change(x)
  File "/tmp/993242231/main.py", line 4, in change
    x += 1
UnboundLocalError: local variable 'x' referenced before assignment

exit status 1

改进1:这样这个x传进去没什么用了,形参而已
# -*- coding: UTF-8 -*-
x = 1
def change(a):
    a += 1
    print a
change(x)
print x

2
1

改进2:这样这个a参数就没什么用了
# -*- coding: UTF-8 -*-
x = 1
def change(a):
    global x
    x += 1
    print x
change(x)
print x

2
2

编辑于 2018-11-22 09:18:40 回复(0)
x是全局变量,函数内部引用,需要使用global申明
发表于 2018-08-27 20:35:41 回复(0)
UnboundLocalError: local variable 'x' referenced before assignment
发表于 2018-08-01 19:54:19 回复(0)
x = 1 def change(a): x += 1 print x change(x)
发表于 2019-10-30 22:52:38 回复(0)
我直接输出2???
发表于 2019-09-19 14:07:42 回复(0)
引用全局变量应该这样用:global x
发表于 2019-09-09 19:01:13 回复(0)
这道题的正确答案:报错
理由:
(1)代码缩进问题,正确代码格式如下:
x = 1
def change(a):
    x += 1
    print x
change(x)
(2)混淆了python中的作用域。
python中的作用域分4种情况:
1)内部作用域Local:嵌套的子级函数中定义的变量拥有,此变量称之为内部变量
2)外部作用域Enclosing:嵌套的父级函数的中定义的变量拥有,此变量称之为外部变量
3)全局作用域Global:模块级别中定义的变量拥有,此变量称之为全局变量
4)内置作用域Built-in:系统固定模块中定义的变量拥有,此变量称之为内置变量
搜索变量的优先级顺序依次是:内部变量>外部变量>全局变量>内置变量(LEGB)
注意:外部变量可以被引用,但外部变量不可以先被引用再进行赋值,除非在嵌套的子函数中先用global 修饰一下外部变量(此时子级函数修改变量,外面的也会发生变化)或者重新定义一个同名变量(此时在子级函数修改变量,外面的不会发生变化)。
a、正确
x = 1
def change(a):
    print x+1
change(x)
b、错误
x = 1
def change(a):
    x += 1
    print x
change(x)
c、正确
x = 1
def change(a):
    global x
    x += 1
    print x
change(x)
d、正确
x = 1
def change(a):
    x = 1
    x += 1
    print x
change(x)
编辑于 2019-07-27 10:07:46 回复(0)
如果改变全局变量的值,就需要用global声明;
如果只是简单的访问,比如直接print输出,就不需要global声明。
而题中是想改变全局变量的值,而没有添加global声明,所以才报错
发表于 2019-07-22 15:51:44 回复(0)
函数中没有x
发表于 2019-07-16 11:12:51 回复(0)
若想在函数内改变全局变量值,必须用global加以声明。
发表于 2019-06-18 20:49:05 回复(0)
首先是缩进问题,其次,就算是有缩进,local变量未定义
发表于 2019-05-28 16:21:00 回复(0)
使用前没有定义
发表于 2019-05-06 19:40:55 回复(0)
想要在方法中使用全局变量,需要在方法中生命 global x
发表于 2019-04-14 13:45:57 回复(0)
global声明全局变量才可函数中使用x
发表于 2019-02-13 18:23:26 回复(0)