- 主题:请教个传参数的问题
这个对象是函数定义处产生,定义只有一次,所以对象也只有一个。不是函数被调用处。
【 在 lilnelse 的大作中提到: 】
: 谢谢,不过还是不太理解为什么每次调用fun时lst会绑定到同一个对象上。这个对象是在函数外部定义的么?不是local的?所以在fun执行结束后还存在,是么?
: 【 在 milksea 的大作中提到: 】
: : 因为:
: ...................
--
FROM 114.249.196.*
原来如此 不过还是感觉有点奇怪。。
【 在 milksea 的大作中提到: 】
: 这个对象是函数定义处产生,定义只有一次,所以对象也只有一个。不是函数被调用处。
: 【 在 lilnelse 的大作中提到: 】
: : 谢谢,不过还是不太理解为什么每次调用fun时lst会绑定到同一个对象上。这个对象是在函数外部定义的么?不是local的?所以在fun执行结束后还存在,是么?
: ...................
--
FROM 114.248.232.20
多谢
【 在 beep 的大作中提到: 】
: 【 在 lilnelse (不折腾) 的大作中提到: 】
: : 标 题: 请教个传参数的问题
: : 发信站: 水木社区 (Thu Dec 31 22:30:08 2020), 站内
: ...................
--
FROM 114.248.232.20
谢谢
【 在 foliver 的大作中提到: 】
: 其实和传值还是传引用没有关系。
:
: 本质是形参和实参的区别。有了默认值,形参就变成实参了。没有默认值,就是从外部传入实参。另外就是变量的作用域。我觉得是python的bug。
: ...................
--
FROM 114.248.232.20
当然与不是值语义也是有关系的。
试想如果是c/c++,传一个结构体值,这个变元即使只在定义时获得一个默认值,函数在被调用时都会产生新的栈上变量。
【 在 foliver 的大作中提到: 】
: 其实和传值还是传引用没有关系。
:
: 本质是形参和实参的区别。有了默认值,形参就变成实参了。没有默认值,就是从外部传入实参。另外就是变量的作用域。我觉得是python的bug。
: ...................
--
FROM 114.249.196.*
所有的函数,不管什么语言,都只传递值。需要理解直接寻址和间接寻址。否则只是半吊子理解。
就比如这个例子,函数内部写一个lst=[1]。外部调用传入一个变量vlist。你觉得调用后vlist会变么?
【 在 milksea 的大作中提到: 】
: 当然与不是值语义也是有关系的。
: 试想如果是c/c++,传一个结构体值,这个变元即使只在定义时获得一个默认值,函数在被调用时都会产生新的栈上变量。
: 【 在 foliver 的大作中提到: 】
: ...................
--来自微水木3.5.8
--
FROM 39.144.40.*
宏语言就普遍不传值,你的例子就失效了。c++,c# 也都可以显式要求按引用传参。
你举的例子是引用语义中变量是从名字到对象的映射(绑定)的一个例子。不少人都喜欢把变量的引用语义理解成变量保存指针值,赋值和传参是对指针按值传递,变量的使用再隐式解引用,这对于C背景的人可能有助于理解,不过这种技术细节其实对描述问题是多余的,程序语言实现也不必然是简单这样做。
一般而言,变量与值的关系不适合像你这样从某种语言具体实现中寻址方式的角度去理解,这其实太特殊了,有时也不符合实际。例如,纯函数式语言具体对象值普遍不可变,但变量的绑定是可变的,这就允许写 a=1 然后写 a=2,但不允许通过 a=a+1 达到这种效果,用变量寻址这种实现细节去解释是很无力的。
【 在 foliver 的大作中提到: 】
: 所有的函数,不管什么语言,都只传递值。需要理解直接寻址和间接寻址。否则只是半吊子理解。
: 就比如这个例子,函数内部写一个lst=[1]。外部调用传入一个变量vlist。你觉得调用后vlist会变么?
:
: ...................
--
FROM 114.249.196.*
我再举个现实的例子吧。
Go 语言的 interface 类型,可以通过指针实现,也可以通过结构体实现。Go 语言是传值的,如果用结构体实现一个 interface,那么该 interface 类型变量的赋值(或者传参)就是对这个结构体深复制,也就是值语义的。但是,在 Go 的编译器具体实现中,interface 类型的变量就是保存结构体指针,使用时自动接引用(否则无法完成运行时多态)。
你看,在这种情况下,Go 的变量是值语义的(赋值进行值的深复制),但同时内部实现又是间接寻址的(需要通过类似虚表的结构访问方法)。这二者并不一致,有趣吧?
【 在 foliver 的大作中提到: 】
: 所有的函数,不管什么语言,都只传递值。需要理解直接寻址和间接寻址。否则只是半吊子理解。
: 就比如这个例子,函数内部写一个lst=[1]。外部调用传入一个变量vlist。你觉得调用后vlist会变么?
:
: ...................
--
修改:milksea FROM 114.249.196.*
FROM 114.249.196.*
【 在 milksea 的大作中提到: 】
: 因为:
: 1、Python 和很多语言一样,变量(包括函数变元)是引用语义的,即变量是对实际对象的一个引用(或者说绑定),对变量的赋值(包括传参)也不会新建一个对象,而是把变量重新引用(绑定)到等号右边的新对象上。
: 2、函数的默认参数的求值,是在定义时一次进行,而不是在每次调用时都进行。
: ...................
赞
--
FROM 59.109.180.*