蜗牛快点爬 发表于 2020-11-24 10:23:35

关于函数变量的问题

def fun(var):
    var = 1314
    print(var, end='')

var = 520
fun(var)
print(var)
为什么上述程序输出的是1314520呢?
我理解的是var = 1314是函数中的局部变量,下面var = 520是全局变量,后面print语句是在这个程序的作用域中实现的,所以不应该是输出520吗

jackz007 发表于 2020-11-24 10:39:56

本帖最后由 jackz007 于 2020-11-24 10:43 编辑

      fun() 内的变量 var 赋值在先,所以,是局部变量,与主函数中的 var 不属于同一个变量。
      调用 fun() 的时候,打印的 var 是 1314,不换行,然后在主函数中打印的 var 是 520,所以,最后输出的就是 1314520。

su咩咩 发表于 2020-11-24 15:29:55

这涉及函数调用中参数传递的问题。在函数调用过程中,进行阐述的传递:
如果是不可变对象,在函数体的修改不会影响实参的值(例如:整型,字符串和元组)
如果是可变的对象,在函数体的修改会影响到实参的值(例如:集合,列表和字典)
我是这样理解的,显示运行函数外面var,赋值为int 520,然后调用fun(),将var=520传参数给函数。但是在函数内重新给了局部变量var赋值1314,所以函数内输出为1314,这时已经结束函数调用fun(var),下一句执行输出var(是实参)还是520,(end不换行,拼接输出)显示是1314520.
再举个例子:

# conding -utf-8

var = 520
t = 1
x =
def fun(var,t):
    var = 1314
    t = t+1
    print(".............调用不可变对象.....................")
    print(var,t)

fun(var,t,)
print(var,t)
print("...............调用可变对象 .........................")
def fun1(x=[]):
    x.append(99)
    for i in x:
      print(i)   
    return x

fun1(x)
print(x)

输出为:
.............调用不可变对象.....................
(1314, 2)
(520, 1)
...............调用可变对象 .........................
1
2
3
99

蜗牛快点爬 发表于 2020-11-25 09:52:42

jackz007 发表于 2020-11-24 10:39
fun() 内的变量 var 赋值在先,所以,是局部变量,与主函数中的 var 不属于同一个变量。
         ...

噢噢明白了 fun()函数运行之后本身是要打印出来的,不换行继续执行后面的程序就是最终结果了,感谢提醒

逃兵 发表于 2020-11-25 10:00:46

输出的是1314520
实际上是两个部分,分别是
1314 和 520
1314是fun函数打印的

def fun(var):
    var = 1314
    print(var, end='')
fun(var)
在fun(var)中有局部变量'var=1314'不论你传入什么参数,都会打印一个1314
而print最后的end='',意味着打印结束后,没有空格,不换行
之后你执行了
print(var)
在全局变量中var=520
会打印一个520

由于fun(var)中print参数end=‘’
这个520会打印在1314的后面
所以有了1314520的效果
页: [1]
查看完整版本: 关于函数变量的问题