通过引用传递的Python字符串-那么为什么不指向新字符串呢?

时间:2018-06-27 06:40:10

标签: python python-3.x

我有以下代码:

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是否相同?

2 个答案:

答案 0 :(得分:0)

@roganjosh已经为您指出了正确的博客文章。归结为Python不会通过引用或值传递变量,而是通过赋值传递变量。您可以参考这些帖子以进一步阐述:

  1. Python functions call by reference
  2. How do I pass a variable by reference?
  3. https://docs.python.org/3/faq/programming.html#how-do-i-write-a-function-with-output-parameters-call-by-reference

答案 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>