初始化python類的例項時,私有變數的值與上一個例項的相同,問題定位
#!/usr/bin/env python
# -*- Coding=UTF-8 -*-
class parser:
def __init__(self, x=[]):
print "early-init: id(x) = %s" % id(x)
self.numbers = x
print "post-init: id(self.numbers) = %s, id(x) = %s" % (id(self.numbers), id(x))
def load(self):
for i in range(0, 10):
self.numbers.append(i)
p = parser()
p.load()
print "len(p.numbers): %s " % len(p.numbers)
p1 = parser()
print "len(p1.numbers): %s " % len(p1.numbers)
上述程式碼的執行結果為:
early-init: id(x) = 4531521656
post-init: id(self.numbers) = 4531521656, id(x) = 4531521656
len(p.numbers): 10
early-init: id(x) = 4531521656
post-init: id(self.numbers) = 4531521656, id(x) = 4531521656
len(p1.numbers): 10
原因很明顯,__init__的預設輸入引數x的地址是不變的。
如果初始化例項p時,沒有指定引數,那麼將拷貝x的值到p.numbers,修改了p.numbers的內容,也就是修改了x的內容。
初始化p1時,引數沒有指定,使用預設值x,x的內容已經被p.numbers修改,不再是[]。
安全的做法是self.numbers = x[:]。
相關文章
- Python - 物件導向程式設計 - 類變數、例項變數/類屬性、例項屬性Python物件程式設計變數
- 2個例項幫你弄清Python的時間和日期問題Python
- Python 類的屬性與例項屬性Python
- 健壯的例項變數 (Non Fragile ivars)和脆弱的例項變數(Fragile ivars)變數
- 利用jstack定位典型效能問題例項JS
- python 類和例項Python
- 執行緒問題2(注意例項變數)執行緒變數
- 關於類的初始化以及類的例項化一些思考
- python中類的建立和例項化Python
- Lumen 報錯提示 例項不了 Response 類的問題
- Java類初始化和例項化Java
- 可變引數例項
- Activiti的流程例項【ProcessInstance】與執行例項【Execution】
- python3將變數輸入的簡單例項Python變數單例
- Dart - 抽象類的例項化Dart抽象
- Python 動態新增例項屬性,例項方法,類屬性,類方法Python
- php例項化物件的例項方法PHP物件
- Python學習:類和例項Python
- 私有建構函式的物件建立例項函式物件
- javascript:私有變數 (靜態私有變數為什麼會被所以例項共享?-答疑解惑)JavaScript變數
- 類和例項
- 【Java貓說】例項變數與區域性變數Java變數
- 如何區分例項化網格中的每個例項
- java中String類常用方法的使用與例項Java
- JVM初探(五):類的例項化JVM
- 題目:設計一個類,我們只能生成該類的一個例項。 程式碼如下
- Python 3 學習筆記之類與例項Python筆記
- python類例項化如何實現Python
- 物件的例項化、記憶體佈局以及訪問定位物件記憶體
- 理解Python中的類物件、例項物件、屬性、方法Python物件
- oracle rac 單個例項不能生成awr報告的問題Oracle
- Navigation問題詳解——Fragment建立新的例項NavigationFragment
- 無法連線windows例項的問題排查Windows
- 分享一個Laravel中的管道的使用例項Laravel
- python例項1Python
- python socket例項Python
- 一個例項中,多個synchronized方法的呼叫synchronized
- python例項方法中self的作用Python
- CSS學習摘要-定位例項CSS