updated for version 7.3.672
Problem:    Not possible to lock/unlock lists in Python interface.
Solution:   Add .locked and .scope attributes. (ZyX)
diff --git a/src/testdir/test86.in b/src/testdir/test86.in
index 93eb400..1309643 100644
--- a/src/testdir/test86.in
+++ b/src/testdir/test86.in
@@ -211,6 +211,41 @@
     m.extend([e.__class__.__name__])
 EOF
 :$put =messages
+:unlet messages
+:" locked and scope attributes
+:let d={} | let dl={} | lockvar dl
+:for s in split("d dl v: g:")
+:    let name=tr(s, ':', 's')
+:    execute 'py '.name.'=vim.bindeval("'.s.'")'
+:    let toput=s.' : '.join(map(['locked', 'scope'], 'v:val.":".pyeval(name.".".v:val)'), ';')
+:    $put =toput
+:endfor
+:silent! let d.abc=1
+:silent! let dl.abc=1
+:py d.locked=True
+:py dl.locked=False
+:silent! let d.def=1
+:silent! let dl.def=1
+:put ='d:'.string(d)
+:put ='dl:'.string(dl)
+:unlet d dl
+:
+:let l=[] | let ll=[] | lockvar ll
+:for s in split("l ll")
+:    let name=tr(s, ':', 's')
+:    execute 'py '.name.'=vim.bindeval("'.s.'")'
+:    let toput=s.' : locked:'.pyeval(name.'.locked')
+:    $put =toput
+:endfor
+:silent! call extend(l, [0])
+:silent! call extend(ll, [0])
+:py l.locked=True
+:py ll.locked=False
+:silent! call extend(l, [1])
+:silent! call extend(ll, [1])
+:put ='l:'.string(l)
+:put ='ll:'.string(ll)
+:unlet l ll
 :"
 :" pyeval()
 :let l=pyeval('range(3)')
@@ -240,6 +275,7 @@
 :call garbagecollect(1)
 :"
 :/^start:/,$wq! test.out
+:call getchar()
 ENDTEST
 
 start:
diff --git a/src/testdir/test86.ok b/src/testdir/test86.ok
index 94f36e9..5ef8689 100644
--- a/src/testdir/test86.ok
+++ b/src/testdir/test86.ok
@@ -44,6 +44,16 @@
 ValueError
 TypeError
 TypeError
+d : locked:0;scope:0
+dl : locked:1;scope:0
+v: : locked:2;scope:1
+g: : locked:0;scope:2
+d:{'abc': 1}
+dl:{'def': 1}
+l : locked:0
+ll : locked:1
+l:[0]
+ll:[1]
 [0, 1, 2]
 ['a', 'b']
 ['c', 1]
diff --git a/src/testdir/test87.in b/src/testdir/test87.in
index 312763c..1d7cced 100644
--- a/src/testdir/test87.in
+++ b/src/testdir/test87.in
@@ -211,6 +211,41 @@
     m.extend([e.__class__.__name__])
 EOF
 :$put =messages
+:unlet messages
+:" locked and scope attributes
+:let d={} | let dl={} | lockvar dl
+:for s in split("d dl v: g:")
+:    let name=tr(s, ':', 's')
+:    execute 'py3 '.name.'=vim.bindeval("'.s.'")'
+:    let toput=s.' : '.join(map(['locked', 'scope'], 'v:val.":".py3eval(name.".".v:val)'), ';')
+:    $put =toput
+:endfor
+:silent! let d.abc=1
+:silent! let dl.abc=1
+:py3 d.locked=True
+:py3 dl.locked=False
+:silent! let d.def=1
+:silent! let dl.def=1
+:put ='d:'.string(d)
+:put ='dl:'.string(dl)
+:unlet d dl
+:
+:let l=[] | let ll=[] | lockvar ll
+:for s in split("l ll")
+:    let name=tr(s, ':', 's')
+:    execute 'py3 '.name.'=vim.bindeval("'.s.'")'
+:    let toput=s.' : locked:'.py3eval(name.'.locked')
+:    $put =toput
+:endfor
+:silent! call extend(l, [0])
+:silent! call extend(ll, [0])
+:py3 l.locked=True
+:py3 ll.locked=False
+:silent! call extend(l, [1])
+:silent! call extend(ll, [1])
+:put ='l:'.string(l)
+:put ='ll:'.string(ll)
+:unlet l ll
 :"
 :" py3eval()
 :let l=py3eval('[0, 1, 2]')
diff --git a/src/testdir/test87.ok b/src/testdir/test87.ok
index 4eab845..4c0bb79 100644
--- a/src/testdir/test87.ok
+++ b/src/testdir/test87.ok
@@ -44,6 +44,16 @@
 ValueError
 TypeError
 TypeError
+d : locked:0;scope:0
+dl : locked:1;scope:0
+v: : locked:2;scope:1
+g: : locked:0;scope:2
+d:{'abc': 1}
+dl:{'def': 1}
+l : locked:0
+ll : locked:1
+l:[0]
+ll:[1]
 [0, 1, 2]
 ['a', 'b']
 ['c', 1]