初始化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[:]。
相關文章
- ruby中的類例項變數和例項的例項變數變數
- 類變數的初始化時機總是處於例項變數的初始化時機之前!變數
- 如何保證一個類中的例項變數不被改變變數
- java 例項變數初始化Java變數
- Python - 物件導向程式設計 - 類變數、例項變數/類屬性、例項屬性Python物件程式設計變數
- C++ 結構體例項和類例項的初始化C++結構體
- Python中類的建立與使用例項Python
- 健壯的例項變數 (Non Fragile ivars)和脆弱的例項變數(Fragile ivars)變數
- 關於例項變數和靜態變數的一點疑問變數
- 2個例項幫你弄清Python的時間和日期問題Python
- Block內部訪問例項變數會出現的問題BloC變數
- Python 類的屬性與例項屬性Python
- 執行緒問題2(注意例項變數)執行緒變數
- 關於類的初始化以及類的例項化一些思考
- RAC環境一個例項何時會歸檔另一個例項的日誌
- 利用jstack定位典型效能問題例項JS
- Python的類例項屬性訪問規則Python
- 請教一個關於JdonFrameworkTest例項的問題Framework
- c#如何只能建立類的一個例項(一)C#
- python 類和例項Python
- Java類初始化和例項化Java
- Python的時間轉換 【例項】Python
- 從一個修改私有變數的問題想到的變數
- 最近遇到的RAC的一個例項無法連線的問題
- OC開發例項變數的訪問控制詳解變數
- oracle:一臺主機多個例項,sqlplus 預設連線到哪個例項的問題OracleSQL
- javascript:私有變數 (靜態私有變數為什麼會被所以例項共享?-答疑解惑)JavaScript變數
- javascript擷取指定位數的小數程式碼例項JavaScript
- python中類的建立和例項化Python
- Python (類)例項方法的特殊屬性Python
- 如何在多例項基礎上再新增一個mysql的例項MySql
- python3將變數輸入的簡單例項Python變數單例
- 實時變化的時鐘效果程式碼例項
- Dart - 抽象類的例項化Dart抽象
- 【Java貓說】例項變數與區域性變數Java變數
- 私有建構函式的物件建立例項函式物件
- Objective-C例項變數Object變數
- 在指定位置插入一個新的li元素程式碼例項