Re: [问题] funcion的参数问题

楼主: uranusjr (←這人是超級笨蛋)   2015-07-15 22:21:02
※ 引述《left (881 forever)》之铭言:
推 tyc5116: 我再研究研究,跟C++差异性有点大@@ 07/15 16:21
→ ck574b027: 我怎么记得C++传array或vector也会动到原本的物件 07/15 17:12
→ ck574b027: mutable是非函数型语言的通病,只是呈现方式不一样而已 07/15 17:15
C++ 要看状况
如果 pass by value, 将 instance 传入 function 隐含 copy 语意
函数内的 container 与外面是不同的 instances, 不会互相影响
Python 的变量是对应到 C++ 的指标
所以
def foo(obj):
print(obj)
a = []
foo(a)
其实对应到类似这样的 C++ 程式(不考虑资源管理, 假装有自动垃圾回收)
void foo(list *obj) {
print(obj);
}
list *a = new list();
foo(a);
如果要拷贝, 就要自己来
void foo(list *obj) {
print(obj);
}
list *a = new list();
foo(new list(*a));
对应回 Python 就是(注意拷贝的 syntax)
def foo(obj):
print(obj)
a = []
foo(a[:])
其实看原 po 第一篇的内容就知道他八成已经懂 C 或 C++
才会有为什么 instance 没有被自动拷贝的疑问
所以我前一篇推文讲得很简短, 因为对原 po 而言这样已经够了
重点是提示 instance 不会自动拷贝, 以及提示拷贝的语法
后面再讲其实都是多的, 只会冒一下丢太多资讯造成混淆的风险
不过既然都讲了, 就一次讲完吧
首先 [:] 这种拷贝语法只适用于 sequence(例如 list)
如果需要比较通用的拷贝语法, 可以用 copy.copy
但 deepcopy 又是另一件事(不只拷贝 list, 还会拷贝里面的东西)
在这里应该不是你要的
另外特别值得一提的是, Python 里面“所有东西”都是指标
所以
a = 5
其实大致对应
Integer *a = new Integer(5);
也所以下面的程式不会印出 2:
def bar(a, b):
a += b
a = 1
b = 1
bar(a, b)
print(a)
其实如果懂 C++ 的话, 基础 Python 应该不会很难懂
因为语意上根本只是 subset 而已
关键在于有些看起来很像的语法其实语意不同, 这要特别注意
作者: tyc5116 (累人啊....)   2014-07-15 16:21:00
我再研究研究,跟C++差异性有点大@@
作者: ck574b027 (荒围!定厝!贼!妹!)   2014-07-15 17:12:00
我怎么记得C++传array或vector也会动到原本的物件mutable是非函数型语言的通病,只是呈现方式不一样而已
作者: tyc5116 (累人啊....)   2015-07-16 08:22:00
是不会难懂,只是对比我一开始的例子,感觉太陷阱了XD
作者: GNUGCC (-std=c++14)   2015-08-10 00:59:00
void main(void) 的写法是可行的唷^^虽然这个写法较传统,但是语法与文法都正确哦^^目前我使用的 Visual C++ 都接受 void main(void) 与int main(void),各位可以把 C++ 专案改成原生 C++ 类型来用 void main(void) 来写发现也可通过编译.这个就是 Visual C++ 的弹性.
作者: flarehunter (Range)   2015-07-16 18:36:00
最后一个例子不是2的原因应该因为是int是immutable吧所有东西都是指标好像没有解释到为什么int不会变但lit会变

Links booklink

Contact Us: admin [ a t ] ucptt.com