风百默 发表于 2022-2-25 10:46:06

这个为什么不是d?用global后不是可以改变全局变量吗?

isdkz 发表于 2022-2-25 10:46:07

本帖最后由 isdkz 于 2022-2-25 15:49 编辑

准确来说,不是 print 有先后顺序,而是对参数的求值有先后顺序,

在对函数传参的时候,不可变对象传的是值,可变对象传的是引用,

而 s 是整数,整数是不可变对象,所以在传参的时候是传值,

print(s, run(5)) 在传参的时候先获取了 s 的值10,并把 10 传进去,而不是传 s 所在的那块内存地址(引用),再来求 run(5) 的值,

获取到的 s 的值是没有执行 run(5) 之前的,所以打印出的 s 的值就是 10。

你可以用一个可变对象来试一下,比如把 s 换成一个列表,

然后在函数里面往列表添加元素,你会发现换成可变对象打印出来的就是两个一样的结果:
s = []
def run(n):
    for i in range(n):
      s.append(i)
    return s
print(s, run(5))

s = []
def run(n):
    global s
    for i in range(n):
      s +=    # 在可变对象中,s = s + 与 s += 是有区别的,前者会改变 s 的指向,而后者不会,你可以把 s += 改成 s = s + 试试
    return s
print(s, run(5))

大马强 发表于 2022-2-25 11:10:08

我现在才发现print有先后顺序{:10_250:}
你看我小小改动了一下print函数中的顺序
s = 10


def fun(n):
    global s
    for i in range(n):
      s += 1
    return s


print(fun(s), s)
结果是 20 20

为了进一步验证改成这样
print(fun(s), s,fun(s))
结果是 20 20 40

所以说print是有先后顺序的

python爱好者. 发表于 2022-2-25 11:16:01

所以就是它会先打印 s 的值,再去执行后面的 run() 函数来改变 s?

风百默 发表于 2022-2-25 13:15:43

isdkz 发表于 2022-2-25 11:49
准确来说,不是 print 有先后顺序,而是对参数的求值有先后顺序,

在对函数传参的时候,不可变对象传的 ...

谢谢您

isdkz 发表于 2022-2-25 13:17:51

风百默 发表于 2022-2-25 13:15
谢谢您

不客气{:5_109:}
页: [1]
查看完整版本: 这个为什么不是d?用global后不是可以改变全局变量吗?