Tôi hơi bối rối về tính bền vững của biến python, trong mã của tôi, tôi sử dụng đoạn mã sau để làm cho các tham số mô hình tồn tại trong các lần lặp nhất định
với open('W_Hs_Hu_iter'+str(inx)+'.pickle', 'wb') là f:
Pickle.dump((self.W,self.Hs,self.Hu),f)
Sau một thời gian dài lặp lại, tôi đã thử sử dụng
Tải mô hình
với open('W_Hs_Hu_iter450.pickle', 'rb') là f:
W,Hs,Hu=pick.load(f)
#W,Hu,Hs= dưa chua.load(f)
Nhưng tôi kiểm tra thì thứ tự của Hs và Hu sai? Liệu điều đó có xảy ra không?
Đây là một phần của một thể hiện của lớp trong đó các giá trị thuộc tính được hoán đổi sau phần chọn.
>>> lớp Foo(đối tượng):
... một = 1
... b = 2
... def __init__(self, c,d):
... self.c = c
... self.d = d
... thanh def (tự):
... return self.a,self.b,self.c,self.d
...
>>> f = Foo(3,4)
>>> _f = dưa chua.dumps(f)
>>> fc,fd = fd,fc
>>> fb,fa = fa,fb
>>> f_ = dưa chua.loads(_f)
>>> f_.bar()
(1, 2, 3, 4)
>>> f.bar()
(2, 1, 4, 3)
Vì vậy, điều này hoạt động như mong đợi. Tuy nhiên, python chọn các lớp theo tham chiếu, vì vậy nếu bạn thay đổi định nghĩa lớp, nó dường như thay đổi các thuộc tính thể hiện.
>>> g = Foo(3,4)
>>> _g = dưa chua.dumps(g)
>>> gc,gd = gd,gc
>>> Foo.a,Foo.b = Foo.b,Foo.a
>>> g_ = dưa chua.loads(_g)
>>> g_.bar()
(2, 1, 3, 4)
>>> g.bar()
(2, 1, 4, 3)
Điều này sẽ rõ ràng hơn nếu bạn có một danh sách hoặc một số chuỗi khác làm thuộc tính lớp. Vì vậy, hãy thêm một số đối tượng danh sách vào lớp.
>>> Foo.a = []
>>> Foo.zap = lambda self:self.a
>>> Foo.baz = lambda self,x:self.a.append(x)
>>>
>>> h = Foo(3,4)
>>> h.baz(0)
>>> h.baz(1)
>>> h.zap()
[0, 1]
>>> _h = dưa chua.dumps(h)
>>> h.baz(2)
>>> h.baz(3)
>>> h_ = dưa chua.loads(_h)
>>> h_.zap()
[0, 1, 2, 3]
Điều này là do giá trị của danh sách thực sự được lưu trữ trên thuộc tính lớp chứ không phải thuộc tính thể hiện. Đây là một trong nhiều ví dụ về loại hành vi này.
Nếu bạn muốn giữ nguyên phiên bản "nguyên trạng" (tức là không được lưu trữ theo tham chiếu) thì bạn nên sử dụng thì là
Thực hiện dưa chua. Nhưng,thì là
Dưa chua sẽ lớn hơn.
>>> nhập khẩu thì là
>>> _h = dill.dumps(h)
>>> h.baz(4)
>>> h.baz(5)
>>> h_ = dill.loads(_h)
>>> h_.zap()
[0, 1, 2, 3]
>>> h.zap()
[0, 1, 2, 3, 4, 5]
Tôi là một lập trình viên xuất sắc, rất giỏi!