作者uranusjr (←这人是超级笨蛋)
看板Python
标题Re: [问题] funcion的参数问题
时间Wed Jul 15 22:21:02 2015
※ 引述《left (881 forever)》之铭言:
1F:推 tyc5116: 我再研究研究,跟C++差异性有点大@@ 07/15 16:21
2F:→ ck574b027: 我怎麽记得C++传array或vector也会动到原本的物件 07/15 17:12
3F:→ 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 而已
关键在於有些看起来很像的语法其实语意不同, 这要特别注意
--
4F:→ GNUGCC:void main(void) 的写法是可行的唷^^08/10 00:59
5F:→ GNUGCC:虽然这个写法较传统,但是语法与文法都正确哦^^08/10 02:16
6F:→ GNUGCC:目前我使用的 Visual C++ 都接受 void main(void) 与 08/10 20:18
7F:→ GNUGCC:int main(void),各位可以把 C++ 专案改成原生 C++ 类型来 08/10 20:19
8F:→ GNUGCC:用 void main(void) 来写发现也可通过编译. 08/10 20:21
9F:→ GNUGCC:这个就是 Visual C++ 的弹性.08/11 20:23
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 218.161.94.175
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1436970065.A.967.html
10F:推 tyc5116: 是不会难懂,只是对比我一开始的例子,感觉太陷阱了XD 07/16 08:22
11F:推 flarehunter: 最後一个例子不是2的原因应该因为是int是immutable吧 07/16 18:36
12F:→ flarehunter: 所有东西都是指标好像没有解释到为什麽int不会变但li 07/16 18:37
13F:→ flarehunter: t会变 07/16 18:37