鱼C论坛

 找回密码
 立即注册
查看: 799|回复: 5

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

[复制链接]
发表于 2022-2-25 10:46:06 | 显示全部楼层 |阅读模式
2鱼币
Screenshot_20220225_104156.jpg
最佳答案
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 换成一个列表,

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


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

最佳答案

查看完整内容

准确来说,不是 print 有先后顺序,而是对参数的求值有先后顺序, 在对函数传参的时候,不可变对象传的是值,可变对象传的是引用, 而 s 是整数,整数是不可变对象,所以在传参的时候是传值, print(s, run(5)) 在传参的时候先获取了 s 的值10,并把 10 传进去,而不是传 s 所在的那块内存地址(引用),再来求 run(5) 的值, 获取到的 s 的值是没有执行 run(5) 之前的,所以打印出的 s 的值就是 10。 你可以用一个 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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 换成一个列表,

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


  1. s = []
  2. def run(n):
  3.     global s
  4.     for i in range(n):
  5.         s += [i]   # 在可变对象中,s = s + [i] 与 s += [i] 是有区别的,前者会改变 s 的指向,而后者不会,你可以把 s += [i] 改成 s = s + [i] 试试
  6.     return s
  7. print(s, run(5))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-25 11:10:08 | 显示全部楼层
我现在才发现print有先后顺序
你看我小小改动了一下print函数中的顺序
  1. s = 10


  2. def fun(n):
  3.     global s
  4.     for i in range(n):
  5.         s += 1
  6.     return s


  7. print(fun(s), s)
复制代码

结果是 20 20

为了进一步验证改成这样
  1. print(fun(s), s,fun(s))
复制代码

结果是 20 20 40

所以说print是有先后顺序的

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-25 11:16:01 | 显示全部楼层
所以就是它会先打印 s 的值,再去执行后面的 run() 函数来改变 s?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-2-25 13:15:43 | 显示全部楼层
isdkz 发表于 2022-2-25 11:49
准确来说,不是 print 有先后顺序,而是对参数的求值有先后顺序,

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

谢谢您
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-25 13:17:51 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-15 00:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表