|
2鱼币
本帖最后由 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 += [i] # 在可变对象中,s = s + [i] 与 s += [i] 是有区别的,前者会改变 s 的指向,而后者不会,你可以把 s += [i] 改成 s = s + [i] 试试
- return s
- print(s, run(5))
复制代码
|
最佳答案
查看完整内容
准确来说,不是 print 有先后顺序,而是对参数的求值有先后顺序,
在对函数传参的时候,不可变对象传的是值,可变对象传的是引用,
而 s 是整数,整数是不可变对象,所以在传参的时候是传值,
print(s, run(5)) 在传参的时候先获取了 s 的值10,并把 10 传进去,而不是传 s 所在的那块内存地址(引用),再来求 run(5) 的值,
获取到的 s 的值是没有执行 run(5) 之前的,所以打印出的 s 的值就是 10。
你可以用一个 ...
|