我有以下代码:
class test:
def __init__(self):
self.variable = 'Old'
self.change(self.variable)
def change(self, var):
var = 'New'
obj = test()
print(obj.variable)
输出为Old
,但我不明白-方法change
获得对类变量variable
的引用,然后为什么self.variable
却不更改为{ {1}},如果我为类中的指针分配了新字符串?
我知道字符串本身是不可变的,但是它不会改变New
表示的指针的值吗?
与C中的self.variable
是否相同?
答案 0 :(得分:0)
@roganjosh已经为您指出了正确的博客文章。归结为Python不会通过引用或值传递变量,而是通过赋值传递变量。您可以参考这些帖子以进一步阐述:
答案 1 :(得分:0)
正如Kasaramvd的评论和roganjosh提供的链接所提到的那样,var只是一个本地名称,它指向一个不可变的对象。 change()函数所能做的就是在其本地名称空间中创建一个名称var并将其绑定到另一个不可变的对象“ New”。
使用self.variable代替var时有效:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:clickable="true">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="@dimen/layout_padding">
<ImageView
android:id="@+id/epfIvUserImage"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_gravity="center"
android:src="@drawable/big_user" />
<EditText
android:id="@+id/epfEtFirstName"
style="@style/EditText"
android:drawableLeft="@drawable/user"
android:hint="@string/user_name"
android:singleLine="true"
android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
android:nextFocusForward="@id/epfEtEmail"
android:imeOptions="actionNext"
/>
<EditText
android:id="@+id/epfEtEmail"
style="@style/EditText"
android:drawableLeft="@drawable/email"
android:hint="@string/email"
android:inputType="textEmailAddress"
android:singleLine="true"
android:nextFocusForward="@id/epfEtCountry"
android:imeOptions="actionNext"
/>
<EditText
android:id="@+id/epfEtCountry"
style="@style/EditText"
android:drawableLeft="@drawable/country"
android:hint="@string/country"
android:singleLine="true"
android:nextFocusForward="@id/epfEtState"
android:imeOptions="actionNext"
/>
<EditText
android:id="@+id/epfEtState"
style="@style/EditText"
android:drawableLeft="@drawable/state"
android:hint="@string/state"
android:singleLine="true"
android:nextFocusForward="@id/epfEtCity"
android:imeOptions="actionNext"/>
<EditText
android:id="@+id/epfEtCity"
style="@style/EditText"
android:drawableLeft="@drawable/city"
android:hint="@string/city"
android:singleLine="true"
android:nextFocusForward="@id/epfEtPincode"
android:imeOptions="actionNext"/>
<EditText
android:id="@+id/epfEtPincode"
style="@style/EditText"
android:drawableLeft="@drawable/street"
android:hint="@string/zip_code"
android:singleLine="true"
android:inputType="text"
android:nextFocusForward="@id/epfEtDescription"
android:imeOptions="actionNext"
/>
<EditText
android:id="@+id/epfEtDescription"
style="@style/EditText"
android:drawableLeft="@drawable/descriptions"
android:hint="@string/description"
android:maxLines="3"
android:overScrollMode="always"
android:scrollbarStyle="insideInset"
android:scrollbars="vertical"
android:paddingBottom="@dimen/_30sdp"
/>
<TextView
android:id="@+id/epfTvUpdate"
android:text="@string/update"
style="@style/TextViewButton"
/>
</LinearLayout>
</ScrollView>