鱼C论坛

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

[已解决]萌新提问作业题,help!

[复制链接]
发表于 2022-1-8 16:38:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
>>> myteacher = '小甲鱼'
>>> yourteacher = myteacher
>>> myteacher = '黑夜'
>>> print(yourteacher)
第三讲中答案是小甲鱼,是因为python默认是按值传递吗,如果是这样的怎么才能让她按地址传递呢?
最佳答案
2022-1-8 18:01:06
本帖最后由 白two 于 2022-1-8 23:05 编辑

>>> myteacher = '小甲鱼'
>>> yourteacher = myteacher
>>> myteacher = '黑夜'

myteacher = '小甲鱼'
开辟了一块内存,用来储存 '小甲鱼' 这个字符串,创建一个变量 myteacher 去指向这个内存

yourteacher = myteacher
创建了一个变量 yourteacher ,指向 myteacher 指向的内存,注意:yourteacher 指向的是 '小甲鱼' 所在的内存,而不是 name 这个变量
本质上是:
hero =  '小甲鱼'

myteacher = '黑夜'
开辟了一块内存,用来储存 '黑夜' 这个字符串,让变量 myteacher 指向这个内存
注意:这个时候变量 yourteacher 还是指向的还是 '小甲鱼' 所在的内存

你看下面的这个内存变化就懂了:
>>> a = 'a'
>>> b = a
>>> id('a')
2240291661808
>>> id(a)
2240291661808
>>> id(b)
2240291661808
>>> a = 'b'
>>> id('a')
2240291661808
>>> id('b')
2240291356848
>>> id(a)
2240291356848
>>> id(b)
2240291661808
你看 b 的 id 是没有变的,它的 id 还是等于 'a' 的 id
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-8 16:51:48 | 显示全部楼层
即使是按地址传递   賦值也不存在傳遞  除非有觀察者去做額外操作
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-8 16:58:28 | 显示全部楼层
kogawananari 发表于 2022-1-8 16:51
即使是按地址传递   賦值也不存在傳遞  除非有觀察者去做額外操作

额,还是有点不太懂,是因为第二行把myteacher中的小甲鱼赋给了yourtheacher,那么这个youteacher就直接是小甲鱼了。那如果程序想让youteacher随着myteacher变化而变化改怎么写程序呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-8 17:12:10 | 显示全部楼层
本帖最后由 kogawananari 于 2022-1-8 17:13 编辑
xuebowen 发表于 2022-1-8 16:58
额,还是有点不太懂,是因为第二行把myteacher中的小甲鱼赋给了yourtheacher,那么这个youteacher就直接 ...


python做不到全局變量的觀察者 JavaScript倒是可以寫個demo
window = global//如果是瀏覽器環境去掉這句

myteacher = '小甲鱼'
Object.defineProperty(window,'youteacher',{
    get:()=>myteacher,
    set:value=>(myteacher=value)
})

console.log(youteacher)//小甲鱼
myteacher = '黑夜'
console.log(youteacher)//黑夜
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-8 17:46:52 | 显示全部楼层
本帖最后由 傻眼貓咪 于 2022-1-8 17:53 编辑
xuebowen 发表于 2022-1-8 16:58
额,还是有点不太懂,是因为第二行把myteacher中的小甲鱼赋给了yourtheacher,那么这个youteacher就直接 ...


因为 Python 万物皆对象,所以好象没有像 C 语言一样的指针概念。
a = b = 13          # a 和 b 指向同样地址
print(id(a), id(b)) # 打印地址

a += 5              # 增幅 a 值

print(a, b)         # 打印 a 值和 b 值
print(id(a), id(b)) # 发现 a 和 b 已经不同地址了,a 地址随着值而改变了,b地址不变
如上,即使 a 已经赋值整数,之后还能变成字符串,布尔值,浮点数都可以(地址也一直改变),不像 C 语言,内存地址不变,而是值改变。
C 语言:
#include <stdio.h>

int main()
{
    int *a, b;
    a = &b;
    b = 13;
    printf("%p %p\n", a, &b);
    
    *a += 5;
    printf("%d %d\n", *a, b);

    printf("%p %p\n", a, &b);
    
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-8 18:01:06 | 显示全部楼层    本楼为最佳答案   
本帖最后由 白two 于 2022-1-8 23:05 编辑

>>> myteacher = '小甲鱼'
>>> yourteacher = myteacher
>>> myteacher = '黑夜'

myteacher = '小甲鱼'
开辟了一块内存,用来储存 '小甲鱼' 这个字符串,创建一个变量 myteacher 去指向这个内存

yourteacher = myteacher
创建了一个变量 yourteacher ,指向 myteacher 指向的内存,注意:yourteacher 指向的是 '小甲鱼' 所在的内存,而不是 name 这个变量
本质上是:
hero =  '小甲鱼'

myteacher = '黑夜'
开辟了一块内存,用来储存 '黑夜' 这个字符串,让变量 myteacher 指向这个内存
注意:这个时候变量 yourteacher 还是指向的还是 '小甲鱼' 所在的内存

你看下面的这个内存变化就懂了:
>>> a = 'a'
>>> b = a
>>> id('a')
2240291661808
>>> id(a)
2240291661808
>>> id(b)
2240291661808
>>> a = 'b'
>>> id('a')
2240291661808
>>> id('b')
2240291356848
>>> id(a)
2240291356848
>>> id(b)
2240291661808
你看 b 的 id 是没有变的,它的 id 还是等于 'a' 的 id
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 13:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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