1. 程式人生 > >Java和Python的引數傳遞

Java和Python的引數傳遞

我之前總結過很多次java的引數傳遞問題,但是總覺得不夠完美,今天再來總結一次,帶上python

java的引數傳遞只有值傳遞,這是首先要宣告的.

如果傳遞的引數是基本資料型別,那就是把本身的複製傳了過去,不管在方法內部怎樣修改這個值,都不會影響到方法外的變數。

如果傳遞的是一個物件,這是十分常見的,就是把這個物件的地址複製一份傳遞過去,這個時候所謂的值就是地址,這個時候就需要分類討論了,對物件的常見的操作在某種意義上就分為兩類,即"."和"=",

如果是".",那麼是會影響到方法外的變數的,這是因為傳遞過來的是複製的一份地址,但複製的和原版的,指向的都是棧中的同一段地址,如果修改了,那麼自然會影響到方法外的引數。

“=”就不一樣了,直接對引數物件使用"=",那就是把這個引數名指向的地址換了一個,然後之後的操作都是對新地址的物件的操作,和方法外的原版變數沒有一點關係,那麼就不會影響到原版引數.

例子的話,大家可以自己試驗一下,例如才方法內部修改String,因為String是一個不可變物件,那麼所有對String的修改操作都相當於"=",還可以在方法內對陣列內的某一個元素進行修改,這就相當於"."操作,


然後順便說一下python,因為我經常把二者搞混,所以還是總結一下比較好.

python的話,在某種意義上和java還是很相似的,python的引數傳遞分為兩種,

1:在大部分情況下,如果直接對整個變數進行重新複製,不管是可變的物件還是不可變的物件,在python中就是把引用指向另一個引數,那麼對於函式外的變數沒有影響,就相當於java中的"="

2:但是對於可變物件的某一個元素,如果進行修改,例如對列表中的某一元素進行重新賦值,那麼對於實參就會產生影響,

這樣看下來,python和java的引數傳遞還是很相似的,只是java中大部分變數都是物件,但是python中操作的大部分都是資料型別,所以不好比較,但是大抵上還是相近的