Hướng dẫn when does python copy or reference - khi nào python sao chép hoặc tham chiếu

Mã của tôi :

locs = [ [1], [2] ]
for loc in locs:
    loc = []

print locs
# prints => [ [1], [2] ]

Tại sao loc không tham khảo các yếu tố của locs?

Python: Mọi thứ được thông qua như tham khảo trừ khi được sao chép rõ ràng [điều này không đúng? ]

Vui lòng giải thích .. Làm thế nào để Python quyết định tham khảo và sao chép?referencing and copying ?

Cập nhật :

Làm thế nào để làm?

def compute(ob):
   if isinstance(ob,list): return process_list(ob)
   if isinstance(ob,dict): return process_dict(ob)

for loc in locs:
   loc = compute(loc)  # What to change here to make loc a reference of actual locs iteration ?
  • LOCS phải chứa phản hồi xử lý cuối cùng!
  • Tôi không muốn sử dụng enumerate, có thể không có nó?

Karl Knechtel

59.4K10 Huy hiệu vàng86 Huy hiệu bạc132 Huy hiệu Đồng10 gold badges86 silver badges132 bronze badges

Đã hỏi ngày 14 tháng 3 năm 2012 lúc 5:36Mar 14, 2012 at 5:36

Hướng dẫn when does python copy or reference - khi nào python sao chép hoặc tham chiếu

Nam Tư Jindleyugal JindleYugal Jindle

42,8K42 Huy hiệu vàng127 Huy hiệu bạc195 Huy hiệu Đồng42 gold badges127 silver badges195 bronze badges

1

Effbot (còn gọi là Fredrik Lundh) đã mô tả phong cách vượt qua của Python là Call-by-object: http://effbot.org/zone/call-by-object.htm

Các đối tượng được phân bổ trên đống và con trỏ cho chúng có thể được truyền xung quanh ở bất cứ đâu.

  • Khi bạn thực hiện một bài tập như
    def compute(ob):
       if isinstance(ob,list): return process_list(ob)
       if isinstance(ob,dict): return process_dict(ob)
    
    for loc in locs:
       loc = compute(loc)  # What to change here to make loc a reference of actual locs iteration ?
    
    0, một mục từ điển được tạo ra ánh xạ chuỗi "X" trong không gian tên hiện tại đến một con trỏ tới đối tượng số nguyên chứa một nghìn.
  • Khi bạn cập nhật "X" với
    def compute(ob):
       if isinstance(ob,list): return process_list(ob)
       if isinstance(ob,dict): return process_dict(ob)
    
    for loc in locs:
       loc = compute(loc)  # What to change here to make loc a reference of actual locs iteration ?
    
    1, một đối tượng số nguyên mới được tạo và từ điển được cập nhật để chỉ vào đối tượng mới. Đối tượng một nghìn cũ không thay đổi (và có thể hoặc không còn sống tùy thuộc vào việc bất cứ điều gì khác có đề cập đến đối tượng).
  • Khi bạn thực hiện một bài tập mới như
    def compute(ob):
       if isinstance(ob,list): return process_list(ob)
       if isinstance(ob,dict): return process_dict(ob)
    
    for loc in locs:
       loc = compute(loc)  # What to change here to make loc a reference of actual locs iteration ?
    
    2, một mục từ điển "y" mới được tạo ra chỉ vào cùng một đối tượng với mục nhập cho "x".
  • Các đối tượng như chuỗi và số nguyên là bất biến. Điều này đơn giản có nghĩa là không có phương pháp nào có thể thay đổi đối tượng sau khi nó được tạo. Ví dụ, một khi đối tượng số nguyên một nghìn được tạo, nó sẽ không bao giờ thay đổi. Toán học được thực hiện bằng cách tạo các đối tượng số nguyên mới.
  • Các đối tượng như danh sách là có thể thay đổi. Điều này có nghĩa là nội dung của đối tượng có thể được thay đổi bằng bất cứ thứ gì chỉ vào đối tượng. Ví dụ:
    def compute(ob):
       if isinstance(ob,list): return process_list(ob)
       if isinstance(ob,dict): return process_dict(ob)
    
    for loc in locs:
       loc = compute(loc)  # What to change here to make loc a reference of actual locs iteration ?
    
    3 sẽ in
    def compute(ob):
       if isinstance(ob,list): return process_list(ob)
       if isinstance(ob,dict): return process_dict(ob)
    
    for loc in locs:
       loc = compute(loc)  # What to change here to make loc a reference of actual locs iteration ?
    
    4. Danh sách trống đã được tạo ra. Cả "x" và "y" đều chỉ vào cùng một danh sách. Phương thức phụ lục đột biến (cập nhật) đối tượng danh sách (như thêm bản ghi vào cơ sở dữ liệu) và kết quả có thể hiển thị cho cả "X" và "Y" (giống như cập nhật cơ sở dữ liệu sẽ được hiển thị cho mọi kết nối với cơ sở dữ liệu đó).

Hy vọng rằng làm rõ vấn đề cho bạn.

Hướng dẫn when does python copy or reference - khi nào python sao chép hoặc tham chiếu

Jamylak

124K29 Huy hiệu vàng227 Huy hiệu bạc229 Huy hiệu Đồng29 gold badges227 silver badges229 bronze badges

Đã trả lời ngày 14 tháng 3 năm 2012 lúc 7:08Mar 14, 2012 at 7:08

Raymond Hettingerraymond HettingerRaymond Hettinger

208K62 Huy hiệu vàng367 Huy hiệu bạc470 Huy hiệu đồng62 gold badges367 silver badges470 bronze badges

0

Mọi thứ trong Python đều được truyền và gán theo giá trị, giống như cách mà mọi thứ được truyền và được gán bởi giá trị trong Java. Mỗi giá trị trong Python là một tham chiếu (con trỏ) đến một đối tượng. Đối tượng không thể là giá trị. Bài tập luôn sao chép giá trị (là một con trỏ); Do đó, hai gợi ý như vậy có thể chỉ vào cùng một đối tượng. Các đối tượng không bao giờ được sao chép trừ khi bạn đang làm điều gì đó rõ ràng để sao chép chúng.

Đối với trường hợp của bạn, mọi lần lặp của vòng lặp đều gán một phần tử của danh sách vào biến loc. Sau đó, bạn gán một cái gì đó khác cho biến loc. Tất cả các giá trị này là con trỏ; Bạn đang chỉ định con trỏ; Nhưng bạn không ảnh hưởng đến bất kỳ đối tượng nào theo bất kỳ cách nào.

Đã trả lời ngày 14 tháng 3 năm 2012 lúc 19:30Mar 14, 2012 at 19:30

7

Nó không giúp ích gì trong Python để suy nghĩ về các tài liệu tham khảo hoặc giá trị. Không đúng.

Trong Python, các biến chỉ là tên. Trong vòng lặp của bạn, loc chỉ là một cái tên chỉ vào phần tử hiện tại trong danh sách. Thực hiện

def compute(ob):
   if isinstance(ob,list): return process_list(ob)
   if isinstance(ob,dict): return process_dict(ob)

for loc in locs:
   loc = compute(loc)  # What to change here to make loc a reference of actual locs iteration ?
8 chỉ đơn giản là đặt lại tên loc vào một danh sách khác, để lại phiên bản gốc.

Nhưng vì trong ví dụ của bạn, mỗi phần tử là một danh sách, bạn thực sự có thể biến đổi yếu tố đó và điều đó sẽ được phản ánh trong danh sách ban đầu:

for loc in locs:
    loc[0] = loc[0] * 2

Đã trả lời ngày 14 tháng 3 năm 2012 lúc 5:42Mar 14, 2012 at 5:42

Daniel Rosemandaniel RosemanDaniel Roseman

577K62 Huy hiệu vàng844 Huy hiệu bạc858 Huy hiệu Đồng62 gold badges844 silver badges858 bronze badges

6

Khi bạn nói

loc = []

Bạn đang sửa đổi biến loc thành danh sách trống mới được tạo

Có lẽ bạn muốn

loc[:] = []

Để gán một lát (tình cờ là toàn bộ danh sách) của LỘC cho danh sách trống

Đã trả lời ngày 14 tháng 3 năm 2012 lúc 5:40Mar 14, 2012 at 5:40

Hướng dẫn when does python copy or reference - khi nào python sao chép hoặc tham chiếu

John La Rooyjohn La RooyJohn La Rooy

Phù bằng vàng 287K5151 gold badges359 silver badges500 bronze badges

1

Mọi thứ được truyền qua đối tượng. Rebinding và đột biến là các hoạt động khác nhau.

locs = [ [1], [2] ]
for loc in locs:
    del loc[:]

print locs

Đã trả lời ngày 14 tháng 3 năm 2012 lúc 5:39Mar 14, 2012 at 5:39

Tại sao LỘC không tham khảo các yếu tố của LOCS?

Nó là. Hoặc ít nhất, theo cùng một nghĩa là mọi biến số khác trong Python là. Các biến Python là tên, không lưu trữ. loc là một cái tên được sử dụng để chỉ các yếu tố của

for loc in locs:
    loc[0] = loc[0] * 2
2, trong khi locs là một cái tên đề cập đến toàn bộ cấu trúc.. Or at least, it is in the same sense that every other variable in Python is. Python variables are names, not storage. loc is a name that is used to refer to elements of
for loc in locs:
    loc[0] = loc[0] * 2
2, while locs is a name that refers to the entire structure.

loc = []

Điều này không có nghĩa là "nhìn vào thứ mà loc tên và khiến nó biến thành

for loc in locs:
    loc[0] = loc[0] * 2
5". Nó không thể có nghĩa là, bởi vì các đối tượng Python không có khả năng như vậy.does not mean "look at the thing that loc names, and cause it to turn into
for loc in locs:
    loc[0] = loc[0] * 2
5". It cannot mean that, because Python objects are not capable of such a thing.

Thay vào đó, nó có nghĩa là "Nguyên nhân loc ngừng là một cái tên cho thứ mà nó hiện là một cái tên và bắt đầu thay vào đó là một tên cho

for loc in locs:
    loc[0] = loc[0] * 2
5". (Tất nhiên, điều đó có nghĩa là
for loc in locs:
    loc[0] = loc[0] * 2
5 cụ thể được cung cấp ở đó, vì nói chung có thể có một số đối tượng trong bộ nhớ giống nhau.)

Đương nhiên, kết quả là nội dung của locs không thay đổi.

Đã trả lời ngày 14 tháng 3 năm 2012 lúc 7:14Mar 14, 2012 at 7:14

Karl Knechtelkarl KnechtelKarl Knechtel

59.4K10 Huy hiệu vàng86 Huy hiệu bạc132 Huy hiệu đồng10 gold badges86 silver badges132 bronze badges

Python là tham khảo hay sao chép?

Python sử dụng một hệ thống, được gọi là Call Call by the Object tham khảo đối tượng hoặc cuộc gọi của người khác. Trong trường hợp bạn chuyển các đối số như toàn bộ số, chuỗi hoặc bộ dữ liệu cho một hàm, việc vượt qua giống như giá trị cuộc gọi vì bạn không thể thay đổi giá trị của các đối tượng bất biến được truyền đến hàm.Call by Object Reference” or “Call by assignment”. In the event that you pass arguments like whole numbers, strings or tuples to a function, the passing is like call-by-value because you can not change the value of the immutable objects being passed to the function.

Python có trở lại theo giá trị hoặc tham chiếu không?

Trong Python, các đối số luôn được truyền theo giá trị và các giá trị trả về luôn được trả về theo giá trị.Tuy nhiên, giá trị được trả về (hoặc thông qua) là một tham chiếu đến một đối tượng có khả năng được chia sẻ, có khả năng bị đột biến.return values are always returned by value. However, the value being returned (or passed) is a reference to a potentially shared, potentially mutable object.

Làm thế nào để python tham chiếu hoạt động?

Một chương trình Python truy cập các giá trị dữ liệu thông qua các tài liệu tham khảo.Tham chiếu là một tên đề cập đến vị trí cụ thể trong bộ nhớ của một giá trị (đối tượng).Tài liệu tham khảo có dạng biến, thuộc tính và mục.Trong Python, một biến hoặc tham chiếu khác không có loại nội tại.A reference is a name that refers to the specific location in memory of a value (object). References take the form of variables, attributes, and items. In Python, a variable or other reference has no intrinsic type.

Mọi thứ có phải là một tài liệu tham khảo không?

Mọi thứ được truyền theo giá trị, nhưng giá trị đó là một tham chiếu đến đối tượng gốc.Nếu bạn sửa đổi đối tượng, các thay đổi có thể hiển thị cho người gọi, nhưng bạn không thể chỉ định lại tên.Hơn nữa, nhiều đối tượng là bất biến (INT, phao, dây, bộ dữ liệu).. If you modify the object, the changes are visible for the caller, but you can't reassign names. Moreover, many objects are immutable (ints, floats, strings, tuples).