python - 클래스 - 파이썬 포인터 변수




파이썬에서 포인터? (4)

나는 파이썬이 포인터를 가지고 있지 않다는 것을 알고 있지만 대신이 yield 2 를 가질 수있는 방법이있다.

>>> a = 1
>>> b = a # modify this line somehow so that b "points to" a
>>> a = 2
>>> b
1

?

예를 들면 다음과 같습니다. form.data['field']form.field.value 가 항상 같은 값을 form.field.valueform.field.value . 그것은 꼭 필요한 것은 아니지만 좋을 것이라고 생각합니다.


form.data['field']form.field.value 가 항상 같은 값을 form.field.value

데코 레이팅 된 이름과 색인이 포함되어 있기 때문에 가능합니다. 즉, 묻는 barenames ab 와는 완전히 다른 구문을 사용하기 때문에 요청할 때 완전히 불가능합니다. 왜 당신이 실제로 원하는 (가능한) 일과 불가능 하고 완전히 다른 것을 요구합니까?

어쩌면 당신은 크게 다른 barenames 및 데코 레이팅 된 이름인지 알지 못합니다. barename a 를 참조하면이 범위에서 마지막으로 바인딩 된 객체를 얻게됩니다 (또는이 범위에 바인딩되지 않은 경우 예외). 이것은 파이썬의 깊고 기본적인 측면입니다. 그것은 전복 될 수 없습니다. 데코 레이팅 된 이름 xy 를 참조 할 때 " y 속성"을 제공하라는 객체 (객체 x 참조하는)를 요청하면 해당 요청에 대한 응답으로 객체가 완전히 임의의 계산을 수행 할 수 있습니다. 상당히 유사하다. 그것은 또한 임의의 계산이 응답으로 수행 될 수있게 해준다).

이제는 "실제 desiderata"예제는 신비 스럽습니다. 각 경우에 두 가지 수준의 색인 생성 또는 속성 가져 오기가 포함되어 있으므로 원하는 미묘함을 다양한 방식으로 도입 할 수 있습니다. form.field 가 가질 수있는 다른 속성은 무엇입니까 (예 : value 외)? 그 이상의 .value 계산이 없다면, 가능성은 다음을 포함합니다 :

class Form(object):
   ...
   def __getattr__(self, name):
       return self.data[name]

class Form(object):
   ...
   @property
   def data(self):
       return self.__dict__

.value 의 존재는 첫 번째 양식을 선택하고 쓸데없는 종류의 래퍼를 제안합니다.

class KouWrap(object):
   def __init__(self, value):
       self.value = value

class Form(object):
   ...
   def __getattr__(self, name):
       return KouWrap(self.data[name])

form.field.value = 23 과 같은 할당이 form.field.value = 23 에 항목을 설정한다고 가정하면 래퍼는 실제로 더 복잡해지며 쓸모없는 것이 아닙니다.

class MciWrap(object):
   def __init__(self, data, k):
       self._data = data
       self._k = k
   @property
   def value(self):
       return self._data[self._k]
   @value.setter
   def value(self, v)
       self._data[self._k] = v

class Form(object):
   ...
   def __getattr__(self, name):
       return MciWrap(self.data, name)

후자의 예제는 파이썬에서와 같이 "포인터"라는 의미에서와 거의 비슷하지만, 이러한 미묘한 부분은 인덱싱 및 / 또는 데코레이션 된 이름 으로 만 작동 할 수 있다는 것을 이해하는 것이 중요합니다. 당신이 원래 물었던 것처럼 barenames와 함께!


그 라인 만 바꿀 수있는 방법은 없습니다. 넌 할 수있어:

a = [1]
b = a
a[0] = 2
b[0]

목록을 작성하고 참조를 a에 지정한 다음 b를 사용하여 참조를 사용하여 첫 번째 요소를 2로 설정 한 다음 b 참조 변수를 사용하여 액세스합니다.


예! 파이썬에서 변수를 포인터로 사용하는 방법이 있습니다!

많은 답변이 부분적으로 잘못되었다는 것을 유감스럽게 생각합니다. 원칙적으로 모든 등호 (=) 할당은 메모리 주소를 공유합니다 (id (obj) 함수를 확인하십시오). 그러나 실제로는 그렇지 않습니다. ( "int"객체와 같은) 단순한 객체와 메모리 공간의 사본으로 마지막으로 동등 ( "=") 행동을하는 변수가 있습니다 (예 : "list", "dict"객체) .

다음은 포인터 지정의 예입니다.

dict1 = {'first':'hello', 'second':'world'}
dict2 = dict1 # pointer assignation mechanism
dict2['first'] = 'bye'
dict1
>>> {'first':'bye', 'second':'world'}

다음은 복사 지정의 예입니다.

a = 1
b = a # copy of memory mechanism. up to here id(a) == id(b)
b = 2 # new address generation. therefore without pointer behaviour
a
>>> 1

포인터 할당은 여분의 메모리를 낭비하지 않고 앨리어싱을위한 매우 유용한 도구입니다. 특정 상황에서 편안하게 코드를 작성하고,

class cls_X():
   ...
   def method_1():
      pd1 = self.obj_clsY.dict_vars_for_clsX['meth1'] # pointer dict 1: aliasing
      pd1['var4'] = self.method2(pd1['var1'], pd1['var2'], pd1['var3'])
   #enddef method_1
   ...
#endclass cls_X

코드 실수를 막기 위해이 사용법을 알고 있어야합니다.

결론적으로, 기본적으로 일부 변수는 barenames (int, float, str, ...과 같은 간단한 개체)이며 일부는 포인터 사이에 할당됩니다 (예 : dict1 = dict2). 어떻게 알아볼 수 있니? 이 실험을 시도해보십시오. 변수 탐색기 패널이있는 IDE에서 일반적으로 포인터 메커니즘 객체의 정의에 메모리 주소 ( "@axbbbbbb ...")가 나타납니다.

주제에서 조사 할 것을 제안합니다. 이 주제에 대해 더 많이 알고있는 사람들이 많이 있습니다. ( "ctypes"모듈 참조). 도움이되기를 바랍니다. 물건을 잘 사용하십시오! 감사합니다, José Crespo


한 가지 관점에서 모든 것은 파이썬에서 포인터입니다. 귀하의 예제는 C ++ 코드와 매우 유사합니다.

int* a = new int(1);
int* b = a;
a = new int(2);
cout << *b << endl;   // prints 1

(좀 더 가깝다면 int* 대신에 어떤 형태의 shared_ptr<Object> 것입니다.)

예를 들면 다음과 같습니다. form.data [ 'field']와 form.field.value가 항상 같은 값을 갖기를 원합니다. 그것은 꼭 필요한 것은 아니지만 좋을 것이라고 생각합니다.

form.data 의 클래스에서 __getitem__ 을 오버로드하여이 작업을 수행 할 수 있습니다.





pointers